package Metier.Objets;


import java.sql.Timestamp;
import java.util.Calendar;
import java.util.GregorianCalendar;
import java.sql.Date;

public class HeurePointe {
    public class Heure extends GregorianCalendar {
        public Heure(int heure, int minute) {
            super(0, 0, 0, heure, minute);
        }

        @Override
        public boolean before(Object o) {
            Calendar c = (o instanceof Calendar ? (Calendar)o : null);
            if (c != null) {
                if (c.get(Calendar.HOUR_OF_DAY) == get(Calendar.HOUR_OF_DAY)){
                    return c.get(Calendar.MINUTE) >= get(Calendar.MINUTE);
                }
                else{
                    return c.get(Calendar.HOUR_OF_DAY) > get(Calendar.HOUR_OF_DAY);
                }
            } else{
                return false;
            }
        }

        @Override
        public boolean after(Object o) {
            Calendar c = (o instanceof Calendar ? (Calendar)o : null);
            if (c != null) {
                if (c.get(Calendar.HOUR_OF_DAY) == get(Calendar.HOUR_OF_DAY)){
                    return c.get(Calendar.MINUTE) <= get(Calendar.MINUTE);
                }
                else{
                    return c.get(Calendar.HOUR_OF_DAY) < get(Calendar.HOUR_OF_DAY);
                }
            } else{
                return false;
            }
        }

        public int getHeure() {
            return get(Calendar.HOUR_OF_DAY);
        }

        public int getMinute() {
            return get(Calendar.MINUTE);
        }

        public void setHeure(int heure) {
            set(Calendar.HOUR_OF_DAY, heure);
        }

        public void setMinute(int minute) {
            set(Calendar.MINUTE, minute);
        }
    }

    private final int id;
    private Heure heureDebut;
    private Heure heureFin;

    public HeurePointe(int id, Heure heureDebut, Heure heureFin) {
        this.id = id;
        this.heureDebut = heureDebut;
        this.heureFin = heureFin;
    }

    public HeurePointe(int id, Date heureDebut, Date heureFin){
        this.id = id;
        this.heureDebut = new Heure(heureDebut.getHours(), heureDebut.getMinutes());
        this.heureFin = new Heure(heureFin.getHours(), heureFin.getMinutes());

    }

    public HeurePointe(int id, Timestamp heureDebut, Timestamp heureFin){
        this.id = id;
        Calendar c =Calendar.getInstance();
        c.setTimeInMillis(heureDebut.getTime());
        this.heureDebut = new Heure(c.get(Calendar.HOUR_OF_DAY), c.get(Calendar.MINUTE));
        c.setTimeInMillis(heureFin.getTime());
        this.heureFin = new Heure(c.get(Calendar.HOUR_OF_DAY), c.get(Calendar.MINUTE));

    }

    public HeurePointe(int id, int heureDebut, int minuteDebut, int heureFin, int minuteFin) {
        this.id = id;
        this.heureDebut = new Heure(heureDebut, minuteDebut);
        this.heureFin = new Heure(heureFin, minuteFin);
    }

    public HeurePointe(int heureDebut, int minuteDebut, int heureFin, int minuteFin) {
        this.id = 0;
        this.heureDebut = new Heure(heureDebut, minuteDebut);
        this.heureFin = new Heure(heureFin, minuteFin);
    }

    /*
     * getters
     */
    public int getId(){
        return id;
    }

    public Heure getHeureDebut() {
            return heureDebut;
    }

    public Heure getHeureFin() {
        return heureFin;
    }

    /*
     * setters
     */
    public void setHeureDebut(Heure heureDebut) {
        this.heureDebut = heureDebut;
    }

    public void setHeureFin(Heure heureFin) {
        this.heureFin = heureFin;
    }

    /*
     * testeurs
     */
    public boolean isEnVigueur(Calendar date) {
        //si l'heure de début est avant l'heure de fin, retourne vrai si la date est entre les deux, sinon retourne faux si la date n'est pas entre les deux
        return (heureDebut.before(heureFin) && heureDebut.before(date) && heureFin.after(date)) || (heureDebut.after(heureFin) && !(heureDebut.before(date) && heureFin.after(date)));
    }

    /**
     * Renvoie true si l'heure de début est inférieure et différente de l'heure de fin, false sinon
     * @return true si l'heure de début est inférieure et différente de l'heure de fin, false sinon
     */
    public boolean isValide(){
        return(heureDebut.before(heureFin) && !(heureDebut.before(heureFin) && heureDebut.after(heureFin)));
    }
}